home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 275_02 / rijn21.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-01  |  25.8 KB  |  901 lines

  1.  
  2. /* rijn21.c                        */
  3. /* program for lcau21 option 'd'            */
  4. /* display de Bruijn diagram - 1st, 2nd, & 3rd gen    */
  5. /* Harold V. McIntosh, 20 February 1988            */
  6. /* 21 February 1988 - add j0=i0; to Pass 4's [HVM]    */
  7.  
  8. /*    Copyright (C) 1987    */
  9. /*    Copyright (C) 1988    */
  10. /*    Harold V. McIntosh    */
  11. /*    Gerardo Cisneros S.    */
  12.  
  13. # define JX   0.8  /* x-center, de Bruijn diagram    */
  14. # define JY   0.5  /* y-center, de Bruijn diagram    */
  15. # define RI 0.455  /* inner radius, de Bruijn diagram    */
  16. # define RO 0.475  /* outer radius, de Bruijn diagram    */
  17. # define NW    24  /* pause after so many lines        */
  18.  
  19. int  dd;        /* # points in de Bruijn ring    */
  20. int  mc, nc, nl;    /* column & line control    */
  21.  
  22. /* edit the de Bruijn diagram */
  23. edijn() {char c;
  24.  
  25.   clijn();
  26.   dd=KK*KK;
  27.   ijn(dd,KK,2);
  28.   while (0<1) {
  29.   videocursor(0,0,36);
  30.   videoputc('?',2);
  31.   c=kbdin();
  32.   if (c=='\015') break;
  33.   videocursor(0,0,38);
  34.   videoputc(c,2);
  35.   videocursor(0,0,36);
  36.   videoputc(' ',2);
  37.   videoscroll(1,0,24,14,0,0);
  38.   videocursor(0,0,0);
  39.   kwait(3);
  40.   switch (c) {
  41.     case 'A': dd=KK*KK; ijn(dd,KK,2); sijn(dd,0,1); break;
  42.     case 'B': dd=KK*KK; ijn(dd,KK,2); sijn(dd,1,1); break;
  43.     case 'C': dd=KK*KK; ijn(dd,KK,2); zijn(dd,0,1); break;
  44.     case 'D': dd=KK*KK; ijn(dd,KK,2); zijn(dd,1,1); break;
  45.     case 'E': dd=KK*KK; ijn(dd,KK,2); zijn(dd,2,1); break;
  46.     case 'F': kwait(0); printf("Precursors 0*:");  kwait(0); xpass1(0); break;
  47.     case 'G': kwait(0); printf("Precursors 1*:");  kwait(0); xpass1(1); break;
  48.     case 'a': kwait(0); printf("(1,1) gliders:");  kwait(0); apass1(0); break;
  49.     case 'b': kwait(0); printf("(1,0) static:");   kwait(0); apass1(1); break;
  50.     case 'c': kwait(0); printf("(1,-1) gliders:"); kwait(0); apass1(2); break;
  51.     case 'd': kwait(0); printf("(2,-2) gliders:"); kwait(0); bpass1(0); break;
  52.     case 'e': kwait(0); printf("(2,-1) gliders:"); kwait(0); bpass1(1); break;
  53.     case 'f': kwait(0); printf("(2,0) cycles:");   kwait(0); bpass1(2); break;
  54.     case 'g': kwait(0); printf("(2,1) gliders:");  kwait(0); bpass1(3); break;
  55.     case 'h': kwait(0); printf("(2,2) gliders:");  kwait(0); bpass1(4); break;
  56.     case 'i': kwait(0); printf("(3,-3) gliders:"); kwait(0); cpass1(0); break;
  57.     case 'j': kwait(0); printf("(3,-2) gliders:"); kwait(0); cpass1(1); break;
  58.     case 'k': kwait(0); printf("(3,-1) gliders:"); kwait(0); cpass1(2); break;
  59.     case 'l': kwait(0); printf("(3,0) cycles:");   kwait(0); cpass1(3); break;
  60.     case 'm': kwait(0); printf("(3,1) gliders:");  kwait(0); cpass1(4); break;
  61.     case 'n': kwait(0); printf("(3,2) gliders:");  kwait(0); cpass1(5); break;
  62.     case 'o': kwait(0); printf("(3,3) gliders:");  kwait(0); cpass1(6); break;
  63.     case 'p': kwait(0); printf("(4,-4) gliders:"); kwait(0); dpass1(0); break;
  64.     case 'q': kwait(0); printf("(4,-3) gliders:"); kwait(0); dpass1(1); break;
  65.     case 'r': kwait(0); printf("(4,-2) gliders:"); kwait(0); dpass1(2); break;
  66.     case 's': kwait(0); printf("(4,-1) gliders:"); kwait(0); dpass1(3); break;
  67.     case 't': kwait(0); printf("(4,0) cycles:");   kwait(0); dpass1(4); break;
  68.     case 'u': kwait(0); printf("(4,1) gliders:");  kwait(0); dpass1(5); break;
  69.     case 'v': kwait(0); printf("(4,2) gliders:");  kwait(0); dpass1(6); break;
  70.     case 'w': kwait(0); printf("(4,3) gliders:");  kwait(0); dpass1(7); break;
  71.     case 'x': kwait(0); printf("(4,4) gliders:");  kwait(0); dpass1(8); break;
  72.     case '1': dd=KK*KK; clijn(); ijn(dd,KK,2); break;
  73.     case '2': dd=KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  74.     case '3': dd=KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  75.     case '4': dd=KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  76.     case '5': dd=KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  77.     case '6': dd=KK*KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  78.     case '+': videopalette(WHCYMAG); break;
  79.     case '-': videopalette(YELREGR); break;
  80.     case '/': case '?': clijn(); break;
  81.     default: break;
  82.     }; /* end switch */
  83.   };   /* end while  */
  84.   videopalette(WHCYMAG);
  85.   videomode(T80X25);
  86. }
  87.  
  88. /* clear edijn screen and set up menu */
  89. clijn() {
  90.   videomode(COLGRAF);
  91.   videopalette(YELREGR);
  92.   videocursor(0,0,0);
  93.   scrrul();
  94.   videocursor(0,3,0);
  95.   printf("de Bruijn ring\n\n");
  96.   printf("abc   - (1,x)\n");
  97.   printf("ABC   - (all)\n");
  98.   printf("defgh - (2,x)\n");
  99.   printf("ijklmno (3,x)\n");
  100.   printf("pqrstuvwx (4)\n");
  101.   printf("123456 -diagram\n");
  102.   printf("DE   -  0*,1*\n");
  103.   printf("FG   -  full n*\n");
  104.   printf("+-   - pallette\n");
  105.   printf("?/   - clr scrn\n");
  106.   printf("<cr> - exit\n\n");
  107. }
  108.  
  109. /* generate a de Bruijn diagram with m nodes, n links per node, color l */
  110. ijn(m,n,l) int m, n, l; {
  111. int    i, j;
  112. double ii, jj, nn, x, y, t, h;
  113. double sin(), cos();
  114. nn=(double)(n);
  115. t=6.28318/((double)(m));
  116. h=0.5*t;
  117. for (i=0; i<m; i++) {
  118.   ii=(double)(i);
  119.   for (j=0; j<n; j++) {
  120.     jj=(double)(j);
  121.     x=JX-RI*sin(ii*t+h);
  122.     y=JY-RI*cos(ii*t+h);
  123.     videoline(x,y,0);
  124.     x=JX-RO*sin((nn*ii+jj)*t+h);
  125.     y=JY-RO*cos((nn*ii+jj)*t+h);
  126.     videoline(x,y,l);
  127.     };
  128.   };
  129. }
  130.  
  131. /* insert a link into a de Bruijn diagram */
  132. /* m - number of vertices */
  133. /* u - initial vertex     */
  134. /* v - terminal vertex    */
  135. /* l - color of link      */
  136. lijnk(m,u,v,l) int m, u, v, l; {
  137. double uu, vv, x, y, t, h;
  138. double sin(), cos();
  139. t=6.28318/((double)(m));
  140. uu=t*((double)(u));
  141. vv=t*((double)(v));
  142. h=0.5*t;
  143. x=JX-RI*sin(uu+h);
  144. y=JY-RI*cos(uu+h);
  145. videoline(x,y,0);
  146. x=JX-RO*sin(vv+h);
  147. y=JY-RO*cos(vv+h);
  148. videoline(x,y,l);
  149. }
  150.  
  151. /* generate a de Bruijn diagram showing antecedents of state k in color l */
  152. sijn(m,k,l) int m, k, l; {
  153. int    i0, i1, i2;
  154. double th, x, y, t, h;
  155. double sin(), cos();
  156. t=6.28318/((double)(m));
  157. h=0.5*t;
  158. for (i0=0; i0<KK; i0++) {
  159. for (i1=0; i1<KK; i1++) {
  160. for (i2=0; i2<KK; i2++) {
  161.   if (k==ascrule[i0][i1][i2]-'0') {
  162.     th=((double)(i0*KK+i1))*t+h;
  163.     x=JX-RI*sin(th);
  164.     y=JY-RI*cos(th);
  165.     videoline(x,y,0);
  166.     th=((double)(i1*KK+i2))*t+h;
  167.     x=JX-RO*sin(th);
  168.     y=JY-RO*cos(th);
  169.     videoline(x,y,l);
  170.     };       /* end if    */
  171.   };};};   /* end for's */
  172. }       /* end sijn  */
  173.  
  174. /* generate a de Bruijn diagram showing the (1,k) links in color l */
  175. zijn(m,k,l) int m, k, l; {
  176. int    i, i0, i1, i2;
  177. double th, x, y, t, h;
  178. double sin(), cos();
  179. t=6.28318/((double)(m));
  180. h=0.5*t;
  181. for (i0=0; i0<KK; i0++) {
  182. for (i1=0; i1<KK; i1++) {
  183. for (i2=0; i2<KK; i2++) {
  184.   i=ascrule[i0][i1][i2]-'0';
  185.   if ((k==0 && i==i0) || (k==1 && i==i1) || (k==2 && i==i2)) {
  186.     th=((double)(i0*KK+i1))*t+h;
  187.     x=JX-RI*sin(th);
  188.     y=JY-RI*cos(th);
  189.     videoline(x,y,0);
  190.     th=((double)(i1*KK+i2))*t+h;
  191.     x=JX-RO*sin(th);
  192.     y=JY-RO*cos(th);
  193.     videoline(x,y,l);
  194.     };       /* end if    */
  195.   };};};   /* end for's */
  196. }       /* end zijn  */
  197.  
  198. /* plot graph on video screen            */
  199. /* move pen from present position to (x,y) */
  200. /* raised if l=0; color l if l>0       */
  201. videoline(x,y,l) double x, y; int l; {
  202. int k, ax, ay, dx, dy, di, dj, x1, y1;
  203. /* if (x<0.0) return; if (x>1.0) return */
  204. /* if (y<0.0) return; if (y>1.0) return */
  205. x1=(int)(199.0*(1.0-y));
  206. y1=(int)(199.0*x);
  207. dx=x1-ix0;
  208. dy=y1-iy0;
  209. ax=dx>=0?dx:-dx;
  210. ay=dy>=0?dy:-dy;
  211. di=dx>=0?1:-1; if (dx==0) di=0;
  212. dj=dy>=0?1:-1; if (dy==0) dj=0;
  213.  
  214. if (l>0) {if (ax!=0 || ay!=0) {
  215.   if (ax>=ay) {for (k=0; k<=ax; k++) videodot(ix0+di*k,60+iy0+(k*dy)/ax,l);}
  216.      else {for (k=0; k<=ay; k++) videodot(ix0+(k*dx)/ay,60+iy0+dj*k,l);};
  217.   }; };
  218. ix0=x1;
  219. iy0=y1;
  220. }
  221.  
  222. /* approximation to sine */
  223. double sin(x) double x; {
  224. if (x<0.0) return(-sin(-x));
  225. while (x>=6.28318) x-=6.28318;
  226. if (x>=3.142) return(-sin(x-3.14159));
  227. if (x>=1.571) return(sin(3.14159-x));
  228. return(x*(1.0-0.166*(x*x-0.05*x*x)));
  229. }
  230.  
  231. /* approximation to cosine */
  232. double cos(x) double x; {double sin(); return(sin(x+1.57079));}
  233.  
  234. /* ONE21.C */
  235.  
  236. /* Pass 1a analyzes all the configurations which fulfil (1,-1+l) */
  237. apass1(l) {
  238. char arry[KK][KK][KK];
  239. int  i,j,k,m;
  240. mc=2;
  241. asctobin();
  242. printf(" Pass1a\015");
  243. for (i=0; i<KK; i++) {
  244. for (j=0; j<KK; j++) {
  245. for (k=0; k<KK; k++) {
  246.   switch (l) {
  247.     case 0: m=i; break;
  248.     case 1: m=j; break;
  249.     case 2: m=k; break;
  250.     default: break;};
  251.   arry[i][j][k]=binrule[i][j][k]==m?'Y':'N';
  252.   };};};
  253. apass2i(arry);
  254. apass2o(arry);
  255. apass4(arry);
  256. }
  257.  
  258. /* Pass 1x analyzes all the configurations mapping into a constant */
  259. xpass1(c) int c; {
  260. char arry[KK][KK][KK];
  261. int  i,j,k;
  262. mc=2;
  263. asctobin();
  264. printf(" Pass1a\015");
  265. for (i=0; i<KK; i++) {
  266. for (j=0; j<KK; j++) {
  267. for (k=0; k<KK; k++) {
  268.   arry[i][j][k]=binrule[i][j][k]==c?'Y':'N';
  269.   };};};
  270. apass2i(arry);
  271. apass2o(arry);
  272. apass4(arry);
  273. }
  274.  
  275. /* Pass 2i flags all links with an incoming arrow */
  276. /* Pass 2o flags all links with an outgoing arrow */
  277. /* Then pass 3 discards all unflagged links */
  278. /* Passes 2 and 3 alternate until no change is observed */
  279.  
  280. apass2i(arry) char arry[KK][KK][KK]; {int i,j,k,m;
  281. do {
  282. printf(" Pass2i\015");
  283. for (i=0; i<KK; i++) {
  284. for (j=0; j<KK; j++) {
  285. for (k=0; k<KK; k++) {
  286. if ((arry[i][j][k]&0x5F)=='Y') {for (m=0; m<KK; m++) arry[j][k][m]|=0x20;};
  287. };};}; } while (apass3(arry)!=0); }
  288.  
  289. apass2o(arry) char arry[KK][KK][KK]; {int i,j,k,m;
  290. do {
  291. printf(" Pass2o\015");
  292. for (i=0; i<KK; i++) {
  293. for (j=0; j<KK; j++) {
  294. for (k=0; k<KK; k++) {
  295. if ((arry[i][j][k]&0x5F)=='Y') {for (m=0; m<KK; m++) arry[m][i][j]|=0x20;};
  296. };};}; } while (apass3(arry)!=0); }
  297.  
  298. /* Pass 3 - erase flags, mark survivors, count changes */
  299.  
  300. int apass3(arry) char arry[KK][KK][KK]; {int i,j,k,l;
  301. l=0;
  302. printf(" Pass3 \015");
  303. for (i=0; i<KK; i++) {
  304. for (j=0; j<KK; j++) {
  305. for (k=0; k<KK; k++) {
  306.   switch (arry[i][j][k]) {
  307.     case 'y': arry[i][j][k]='Y'; break;
  308.     case 'Y': arry[i][j][k]='N'; l=1; break;
  309.     case 'n': case 'N': arry[i][j][k]='N'; break;
  310.     default: break; };
  311. };};};
  312. return l;
  313. }
  314.  
  315. /* Pass4 - print loops which remain */
  316. apass4(arry) char arry[KK][KK][KK]; {
  317. int i0, i1, i2;
  318. int j0, j1, j2;
  319. int k, l, m;
  320. printf(" pass4 \015");
  321. for (i0=0; i0<KK; i0++) {
  322. for (i1=0; i1<KK; i1++) {
  323. for (i2=0; i2<KK; i2++) {
  324. j0=i0; j1=i1; j2=i2; l=0; m=0;
  325. do {
  326.         if (arry[0][j1][j2]=='Y')
  327.     {arry[0][j1][j2]='y';
  328.     k=j2; j2=j1; j1=0; m=1;}
  329.   else {if (arry[1][j1][j2]=='Y')
  330.     {arry[1][j1][j2]='y';
  331.     k=j2; j2=j1; j1=1; m=1;}
  332.   else {l=1; if (m==1) {j0=j1; j1=j2; j2=k;}; };};
  333.   } while (l==0);
  334. l=0; 
  335. m=0;
  336. do {
  337.         if (arry[j0][j1][0]=='y')
  338.    {aprf(j0,j1,0);
  339.    arry[j0][j1][0]='N';
  340.    j0=j1; j1=0; m=1;}
  341.   else {if (arry[j0][j1][1]=='y')
  342.    {aprf(j0,j1,1);
  343.    arry[j0][j1][1]='N';
  344.    j0=j1; j1=1; m=1;}
  345.   else {l=1;};};
  346.   } while (l==0);
  347. l=0;
  348. do {
  349.         if (arry[j0][j1][0]=='Y')
  350.    {aprf(j0,j1,0);
  351.    arry[j0][j1][0]='N';
  352.    j0=j1; j1=0; m=1;}
  353.   else {if (arry[j0][j1][1]=='Y')
  354.    {aprf(j0,j1,1);
  355.    arry[j0][j1][1]='N';
  356.    j0=j1; j1=1; m=1;}
  357.   else {l=1; if (m==1) kwait(0);};};
  358.   } while (l==0);
  359. };};};
  360. }
  361.  
  362. /* print one link of the de Bruijn diagram */
  363. aprf(i,j,k) int i, j, k; {
  364. kwait(1);
  365. printf("%1d",i);
  366. printf("%1d",j);
  367. printf("-");
  368. printf("%1d",k);
  369. printf("  ");
  370. lijnk(dd,i*KK+j,j*KK+k,3);
  371. }
  372.  
  373. /* TWO21.C */
  374.  
  375. /* Pass 1analyzes all sequences conforming to (2,-2+l)  */
  376. bpass1(l) int l; {
  377. char arry[KK][KK][KK][KK][KK];
  378. int  i0, i1, i2, i3, i4;
  379. int  i, j, k, m;
  380. mc=2;
  381. asctobin();
  382. printf(" Pass1a\015");
  383. for (i0=0; i0<KK; i0++) {
  384. for (i1=0; i1<KK; i1++) {
  385. for (i2=0; i2<KK; i2++) {
  386. for (i3=0; i3<KK; i3++) {
  387. for (i4=0; i4<KK; i4++) {
  388.   i=binrule[i0][i1][i2];
  389.   j=binrule[i1][i2][i3];
  390.   k=binrule[i2][i3][i4];
  391.   switch (l) {
  392.     case 0: m=i0; break;
  393.     case 1: m=i1; break;
  394.     case 2: m=i2; break;
  395.     case 3: m=i3; break;
  396.     case 4: m=i4; break;
  397.     default: break;};
  398.   arry[i0][i1][i2][i3][i4]=binrule[i][j][k]==m?'Y':'N';
  399.   };};};};};
  400. bpass2i(arry);
  401. bpass2o(arry);
  402. bpass4(arry);
  403. }
  404.  
  405. /* Passs 2i flags links which have an incoming arrow */
  406. bpass2i(arry) char arry[KK][KK][KK][KK][KK]; {
  407. int i0, i1, i2, i3, i4, m;
  408. printf(" Pass2i\015");
  409. do {
  410. for (i0=0; i0<KK; i0++) {
  411. for (i1=0; i1<KK; i1++) {
  412. for (i2=0; i2<KK; i2++) {
  413. for (i3=0; i3<KK; i3++) {
  414. for (i4=0; i4<KK; i4++) {
  415. if ((arry[i0][i1][i2][i3][i4]&0x5F)=='Y')
  416.  {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][m]|=0x20;};
  417. };};};};};
  418. } while (bpass3(arry)!=0); }
  419.  
  420. /* Passs 2o flags links which have an outgoing arrow */
  421. bpass2o(arry) char arry[KK][KK][KK][KK][KK]; {
  422. int i0, i1, i2, i3, i4, m;
  423. do {
  424. printf(" Pass2o\015");
  425. for (i0=0; i0<KK; i0++) {
  426. for (i1=0; i1<KK; i1++) {
  427. for (i2=0; i2<KK; i2++) {
  428. for (i3=0; i3<KK; i3++) {
  429. for (i4=0; i4<KK; i4++) {
  430. if ((arry[i0][i1][i2][i3][i4]&0x5F)=='Y')
  431.  {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3]|=0x20;};
  432. };};};};};
  433. } while (bpass3(arry)!=0); }
  434.  
  435. /*  Pass 3 erases flags, marks survivors, counts channges */
  436. int bpass3(arry) char arry[KK][KK][KK][KK][KK]; {
  437. int i0, i1, i2, i3, i4, l;
  438. printf(" Pass3 \015");
  439. l=0;
  440. for (i0=0; i0<KK; i0++) {
  441. for (i1=0; i1<KK; i1++) {
  442. for (i2=0; i2<KK; i2++) {
  443. for (i3=0; i3<KK; i3++) {
  444. for (i4=0; i4<KK; i4++) {
  445. switch (arry[i0][i1][i2][i3][i4]) {
  446.     case 'y': arry[i0][i1][i2][i3][i4]='Y'; break;
  447.     case 'Y': arry[i0][i1][i2][i3][i4]='N'; l=1; break;
  448.     case 'n': case 'N': arry[i0][i1][i2][i3][i4]='N'; break;
  449.     default: break; };
  450. };};};};};
  451. return l;
  452. }
  453.  
  454. /* Pass 4 prints loops which remain */
  455. bpass4(arry) char arry[KK][KK][KK][KK][KK]; {
  456. int i0, i1, i2, i3, i4;
  457. int j0, j1, j2, j3, j4, k, l, m;
  458. printf(" pass4 \015");
  459. for (i0=0; i0<KK; i0++) {
  460. for (i1=0; i1<KK; i1++) {
  461. for (i2=0; i2<KK; i2++) {
  462. for (i3=0; i3<KK; i3++) {
  463. for (i4=0; i4<KK; i4++) {
  464. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4; l=0; m=0;
  465. do {
  466.         if (arry[0][j1][j2][j3][j4]=='Y')
  467.     {arry[0][j1][j2][j3][j4]='y';
  468.     k=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  469.   else {if (arry[1][j1][j2][j3][j4]=='Y')
  470.     {arry[1][j1][j2][j3][j4]='y';
  471.     k=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  472.   else {l=1; if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=k;}; };};
  473.   } while (l==0);
  474. l=0; 
  475. m=0;
  476. do {
  477.         if (arry[j0][j1][j2][j3][0]=='y')
  478.    {bprf(j0,j1,j2,j3,0);
  479.    arry[j0][j1][j2][j3][0]='N';
  480.    j0=j1; j1=j2; j2=j3; j3=0; m=1;}
  481.   else {if (arry[j0][j1][j2][j3][1]=='y')
  482.    {bprf(j0,j1,j2,j3,1);
  483.    arry[j0][j1][j2][j3][1]='N';
  484.    j0=j1; j1=j2; j2=j3; j3=1; m=1;}
  485.   else {l=1;};};
  486.   } while (l==0);
  487. l=0;
  488. do {
  489.         if (arry[j0][j1][j2][j3][0]=='Y')
  490.    {bprf(j0,j1,j2,j3,0);
  491.    arry[j0][j1][j2][j3][0]='N';
  492.    j0=j1; j1=j2; j2=j3; j3=0; m=1;}
  493.   else {if (arry[j0][j1][j2][j3][1]=='Y')
  494.    {bprf(j0,j1,j2,j3,1);
  495.    arry[j0][j1][j2][j3][1]='N';
  496.    j0=j1; j1=j2; j2=j3; j3=1; m=1;}
  497.   else {l=1; if (m==1) {kwait(0);} ;};};
  498.   } while (l==0);
  499. };};};};};
  500. }
  501.  
  502. /* print one of the links in a chain */
  503. bprf(i0,i1,i2,i3,i4) int i0, i1,i2, i3, i4; {
  504. kwait(1);
  505. printf("%1d",i0);
  506. printf("%1d",i1);
  507. printf("%1d",i2);
  508. printf("%1d",i3);
  509. printf("-");
  510. printf("%1d",i4);
  511. printf(" ");
  512. lijnk(dd,((i0*KK+i1)*KK+i2)*KK+i3,((i1*KK+i2)*KK+i3)*KK+i4,3);
  513. }
  514.  
  515. /* pause at the end of a full screen        */
  516. /* kwait(0) - short or null line        */
  517. /* kwait(1) - split long lines as necessary */
  518. /* kwait(2) - wait to continue            */
  519. /* kwait(3) - reset                 */
  520. kwait(i) int i; {
  521. switch (i) {
  522.   case 0: printf("\n"); nc=0; nl++; break;
  523.   case 1: if (nc==mc) {printf("&\n"); nc=1; nl++;} else nc++; break;
  524.   case 2: nl=NW; break;
  525.   case 3: nc=0; nl=0; break;
  526.   default: break;};
  527. if (nl==NW) {
  528.   nl=1;
  529.   printf(" press any key to continue\015");
  530.   while (kbdst()) {};
  531.   kbdin();
  532.   printf("                          \015");
  533.   videoscroll(1,0,24,14,0,0);
  534.   videocursor(0,0,0);
  535.   printf("\n");
  536.   };
  537. }
  538.  
  539. /* THREE21.C */
  540.  
  541. /* Pass 1 marks sequences conforming to (3,-3+l) */
  542. cpass1(l) int l; {
  543. char arry[KK][KK][KK][KK][KK][KK][KK];
  544. int  i0, i1, i2, i3, i4, i5, i6;
  545. int  j0, j1, j2, j3, j4;
  546. int  i, j, k, m;
  547. mc=1;
  548. asctobin();
  549. printf(" pass1 \015");
  550. for (i0=0; i0<KK; i0++) {
  551. for (i1=0; i1<KK; i1++) {
  552. for (i2=0; i2<KK; i2++) {
  553. for (i3=0; i3<KK; i3++) {
  554. for (i4=0; i4<KK; i4++) {
  555. for (i5=0; i5<KK; i5++) {
  556. for (i6=0; i6<KK; i6++) {
  557. j0=binrule[i0][i1][i2];
  558. j1=binrule[i1][i2][i3];
  559. j2=binrule[i2][i3][i4];
  560. j3=binrule[i3][i4][i5];
  561. j4=binrule[i4][i5][i6];
  562. i=binrule[j0][j1][j2];
  563. j=binrule[j1][j2][j3];
  564. k=binrule[j2][j3][j4];
  565. switch (l) {
  566.   case 0: m=i0; break;
  567.   case 1: m=i1; break;
  568.   case 2: m=i2; break;
  569.   case 3: m=i3; break;
  570.   case 4: m=i4; break;
  571.   case 5: m=i5; break;
  572.   case 6: m=i6; break;
  573.   default: break;};
  574. arry[i0][i1][i2][i3][i4][i5][i6]=binrule[i][j][k]==m?'Y':'N';
  575. };};};};};};};
  576. cpass2i(arry);
  577. cpass2o(arry);
  578. cpass4(arry);
  579. }
  580.  
  581. /* Pass 2i flags links which have an incoming arrow */
  582. cpass2i(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  583. int i0, i1, i2, i3, i4, i5, i6, m;
  584. do {
  585. printf(" pass2i\015");
  586. for (i0=0; i0<KK; i0++) {
  587. for (i1=0; i1<KK; i1++) {
  588. for (i2=0; i2<KK; i2++) {
  589. for (i3=0; i3<KK; i3++) {
  590. for (i4=0; i4<KK; i4++) {
  591. for (i5=0; i5<KK; i5++) {
  592. for (i6=0; i6<KK; i6++) {
  593. if ((arry[i0][i1][i2][i3][i4][i5][i6]&0x5F)=='Y')
  594.  {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][i5][i6][m]|=0x20;};
  595. };};};};};};};
  596. } while (cpass3(arry)!=0); }
  597.  
  598. /* Pass 2o flags links which have an outgoing arrow */
  599. cpass2o(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  600. int i0, i1, i2, i3, i4, i5, i6, m;
  601. do {
  602. printf(" pass2o\015");
  603. for (i0=0; i0<KK; i0++) {
  604. for (i1=0; i1<KK; i1++) {
  605. for (i2=0; i2<KK; i2++) {
  606. for (i3=0; i3<KK; i3++) {
  607. for (i4=0; i4<KK; i4++) {
  608. for (i5=0; i5<KK; i5++) {
  609. for (i6=0; i6<KK; i6++) {
  610. if ((arry[i0][i1][i2][i3][i4][i5][i6]&0x5F)=='Y')
  611.  {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3][i4][i5]|=0x20;};
  612. };};};};};};};
  613. } while (cpass3(arry)!=0); }
  614.  
  615. /*  Pass 3 erases flags, marks survivors, counts channges */
  616. int cpass3(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  617. int i0, i1, i2, i3, i4, i5, i6, l;
  618. l=0;
  619. printf(" pass3 \015");
  620. for (i0=0; i0<KK; i0++) {
  621. for (i1=0; i1<KK; i1++) {
  622. for (i2=0; i2<KK; i2++) {
  623. for (i3=0; i3<KK; i3++) {
  624. for (i4=0; i4<KK; i4++) {
  625. for (i5=0; i5<KK; i5++) {
  626. for (i6=0; i6<KK; i6++) {
  627. switch (arry[i0][i1][i2][i3][i4][i5][i6]) {
  628.     case 'y': arry[i0][i1][i2][i3][i4][i5][i6]='Y'; break;
  629.     case 'Y': arry[i0][i1][i2][i3][i4][i5][i6]='N'; l=1; break;
  630.     case 'n': case 'N': arry[i0][i1][i2][i3][i4][i5][i6]='N'; break;
  631.     default: break; };
  632. };};};};};};};
  633. return l; }
  634.  
  635. /* Pass 4 prints loops which remain */
  636. cpass4(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  637. int i0, i1, i2, i3, i4, i5, i6;
  638. int j0, j1, j2, j3, j4, j5, j6;
  639. int  k, l, m;
  640. printf(" pass4 \015");
  641. for (i0=0; i0<KK; i0++) {
  642. for (i1=0; i1<KK; i1++) {
  643. for (i2=0; i2<KK; i2++) {
  644. for (i3=0; i3<KK; i3++) {
  645. for (i4=0; i4<KK; i4++) {
  646. for (i5=0; i5<KK; i5++) {
  647. for (i6=0; i6<KK; i6++) {
  648. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4; j5=i5; j6=i6;
  649. l=0;
  650. m=0;
  651. do {
  652.         if (arry[0][j1][j2][j3][j4][j5][j6]=='Y')
  653.     {arry[0][j1][j2][j3][j4][j5][j6]='y';
  654.     k=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  655.   else {if (arry[1][j1][j2][j3][j4][j5][j6]=='Y')
  656.     {arry[1][j1][j2][j3][j4][j5][j6]='y';
  657.     k=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  658.   else {l=1;
  659.     if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=k;};
  660.     };};
  661.   } while (l==0);
  662. l=0; 
  663. m=0;
  664. do {
  665.         if (arry[j0][j1][j2][j3][j4][j5][0]=='y')
  666.    {cprf(j0,j1,j2,j3,j4,j5,0);
  667.    arry[j0][j1][j2][j3][j4][j5][0]='N';
  668.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=0; m=1;}
  669.   else {if (arry[j0][j1][j2][j3][j4][j5][1]=='y')
  670.    {cprf(j0,j1,j2,j3,j4,j5,1);
  671.    arry[j0][j1][j2][j3][j4][j5][1]='N';
  672.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=1; m=1;}
  673.   else {l=1;};};
  674.   } while (l==0);
  675. l=0;
  676. do {
  677.         if (arry[j0][j1][j2][j3][j4][j5][0]=='Y')
  678.    {cprf(j0,j1,j2,j3,j4,j5,0);
  679.    arry[j0][j1][j2][j3][j4][j5][0]='N';
  680.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=0; m=1;}
  681.   else {if (arry[j0][j1][j2][j3][j4][j5][1]=='Y')
  682.    {cprf(j0,j1,j2,j3,j4,j5,1);
  683.    arry[j0][j1][j2][j3][j4][j5][1]='N';
  684.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=1; m=1;}
  685.   else {l=1; if (m==1) kwait(0);};};
  686.   } while (l==0);
  687. };};};};};};};
  688. }
  689.  
  690. /* print one of the individual links in a chain */
  691. cprf(i0,i1,i2,i3,i4,i5,i6)
  692. int i0, i1, i2, i3, i4, i5, i6; {int i, j;
  693. kwait(1);
  694. printf("%1d",i0);
  695. printf("%1d",i1);
  696. printf("%1d",i2);
  697. printf("%1d",i3);
  698. printf("%1d",i4);
  699. printf("%1d",i5);
  700. printf("-");
  701. printf("%1d",i6);
  702. printf(" ");
  703. i=((((i0*KK+i1)*KK+i2)*KK+i3)*KK+i4)*KK+i5;
  704. j=((((i1*KK+i2)*KK+i3)*KK+i4)*KK+i5)*KK+i6;
  705. lijnk(dd,i,j,3);
  706. }
  707.  
  708. /* FOUR21.C */
  709.  
  710. /* mark sequences conforming to (4,-4+l) */
  711. dpass1(l) int l; {
  712. char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK];
  713. int i0, i1, i2, i3, i4, i5, i6, i7, i8;
  714. int j0, j1, j2, j3, j4, j5, j6;
  715. int k0, k1, k2, k3, k4;
  716. int i, j, k, m;
  717. mc=1;
  718. asctobin();
  719. printf(" pass1 \015");
  720. for (i0=0; i0<KK; i0++) {
  721. for (i1=0; i1<KK; i1++) {
  722. for (i2=0; i2<KK; i2++) {
  723. for (i3=0; i3<KK; i3++) {
  724. for (i4=0; i4<KK; i4++) {
  725. for (i5=0; i5<KK; i5++) {
  726. for (i6=0; i6<KK; i6++) {
  727. for (i7=0; i7<KK; i7++) {
  728. for (i8=0; i8<KK; i8++) {
  729. j0=binrule[i0][i1][i2];
  730. j1=binrule[i1][i2][i3];
  731. j2=binrule[i2][i3][i4];
  732. j3=binrule[i3][i4][i5];
  733. j4=binrule[i4][i5][i6];
  734. j5=binrule[i5][i6][i7];
  735. j6=binrule[i6][i7][i8];
  736. k0=binrule[j0][j1][j2];
  737. k1=binrule[j1][j2][j3];
  738. k2=binrule[j2][j3][j4];
  739. k3=binrule[j3][j4][j5];
  740. k4=binrule[j4][j5][j6];
  741. i=binrule[k0][k1][k2];
  742. j=binrule[k1][k2][k3];
  743. k=binrule[k2][k3][k4];
  744. switch (l) {
  745.   case 0: m=i0; break;
  746.   case 1: m=i1; break;
  747.   case 2: m=i2; break;
  748.   case 3: m=i3; break;
  749.   case 4: m=i4; break;
  750.   case 5: m=i5; break;
  751.   case 6: m=i6; break;
  752.   case 7: m=i7; break;
  753.   case 8: m=i8; break;
  754.   default: break;};
  755. arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]=binrule[i][j][k]==m?'Y':'N';
  756. };};};};};};};};};
  757. dpass2i(arry);
  758. dpass2o(arry);
  759. dpass4(arry);
  760. }
  761.  
  762. /* Pass 2i flags links which have an incoming arrow */
  763. dpass2i(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  764. int i0, i1, i2, i3, i4, i5, i6, i7, i8, m;
  765. do {
  766. printf(" pass2i\015");
  767. for (i0=0; i0<KK; i0++) {
  768. for (i1=0; i1<KK; i1++) {
  769. for (i2=0; i2<KK; i2++) {
  770. for (i3=0; i3<KK; i3++) {
  771. for (i4=0; i4<KK; i4++) {
  772. for (i5=0; i5<KK; i5++) {
  773. for (i6=0; i6<KK; i6++) {
  774. for (i7=0; i7<KK; i7++) {
  775. for (i8=0; i8<KK; i8++) {
  776. if ((arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]&0x5F)=='Y')
  777.  {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][i5][i6][i7][i8][m]|=0x20;};
  778. };};};};};};};};};
  779. } while (dpass3(arry)!=0); }
  780.  
  781. /* Pass 2o flags links which have an outgoing arrow */
  782. dpass2o(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  783. int i0, i1, i2, i3, i4, i5, i6, i7, i8, m;
  784. do {
  785. printf(" pass2o\015");
  786. for (i0=0; i0<KK; i0++) {
  787. for (i1=0; i1<KK; i1++) {
  788. for (i2=0; i2<KK; i2++) {
  789. for (i3=0; i3<KK; i3++) {
  790. for (i4=0; i4<KK; i4++) {
  791. for (i5=0; i5<KK; i5++) {
  792. for (i6=0; i6<KK; i6++) {
  793. for (i7=0; i7<KK; i7++) {
  794. for (i8=0; i8<KK; i8++) {
  795. if ((arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]&0x5F)=='Y')
  796.  {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3][i4][i5][i6][i7]|=0x20;};
  797. };};};};};};};};};
  798. } while (dpass3(arry)!=0); }
  799.  
  800. /* erase flags, mark survivors, count channges */
  801. int dpass3(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  802. int i0, i1, i2, i3, i4, i5, i6, i7, i8, l;
  803. l=0;
  804. printf(" pass3 \015");
  805. for (i0=0; i0<KK; i0++) {
  806. for (i1=0; i1<KK; i1++) {
  807. for (i2=0; i2<KK; i2++) {
  808. for (i3=0; i3<KK; i3++) {
  809. for (i4=0; i4<KK; i4++) {
  810. for (i5=0; i5<KK; i5++) {
  811. for (i6=0; i6<KK; i6++) {
  812. for (i7=0; i7<KK; i7++) {
  813. for (i8=0; i8<KK; i8++) {
  814. switch (arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]) {
  815.     case 'y': arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]='Y'; break;
  816.     case 'Y': arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]='N'; l=1; break;
  817.     case 'n': case 'N': arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]='N'; break;
  818.     default: break; };
  819. };};};};};};};};};
  820. return l; }
  821.  
  822. /* Pass4 - print loops which remain */
  823. dpass4(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  824. int i0, i1, i2, i3, i4, i5, i6, i7, i8;
  825. int j0, j1, j2, j3, j4, j5, j6, j7, j8;
  826. int k, l, m;
  827. printf(" pass4 \015");
  828. for (i0=0; i0<KK; i0++) {
  829. for (i1=0; i1<KK; i1++) {
  830. for (i2=0; i2<KK; i2++) {
  831. for (i3=0; i3<KK; i3++) {
  832. for (i4=0; i4<KK; i4++) {
  833. for (i5=0; i5<KK; i5++) {
  834. for (i6=0; i6<KK; i6++) {
  835. for (i7=0; i7<KK; i7++) {
  836. for (i8=0; i8<KK; i8++) {
  837. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4; j5=i5; j6=i6; j7=i7; j8=i8;
  838. l=0;
  839. m=0;
  840. do {
  841.         if (arry[0][j1][j2][j3][j4][j5][j6][j7][j8]=='Y')
  842.     {arry[0][j1][j2][j3][j4][j5][j6][j7][j8]='y';
  843.     k=j8; j8=j7; j7=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  844.   else {if (arry[1][j1][j2][j3][j4][j5][j6][j7][j8]=='Y')
  845.     {arry[1][j1][j2][j3][j4][j5][j6][j7][j8]='y';
  846.     k=j8; j8=j7; j7=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  847.   else {l=1;
  848.     if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=j8; j8=k;};
  849.     };};
  850.   } while (l==0);
  851. l=0; 
  852. m=0;
  853. do {
  854.         if (arry[j0][j1][j2][j3][j4][j5][j6][j7][0]=='y')
  855.    {dprf(j0,j1,j2,j3,j4,j5,j6,j7,0);
  856.    arry[j0][j1][j2][j3][j4][j5][j6][j7][0]='N';
  857.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=0; m=1;}
  858.   else {if (arry[j0][j1][j2][j3][j4][j5][j6][j7][1]=='y')
  859.    {dprf(j0,j1,j2,j3,j4,j5,j6,j7,1);
  860.    arry[j0][j1][j2][j3][j4][j5][j6][j7][1]='N';
  861.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=1; m=1;}
  862.   else {l=1;};};
  863.   } while (l==0);
  864. l=0;
  865. do {
  866.         if (arry[j0][j1][j2][j3][j4][j5][j6][j7][0]=='Y')
  867.    {dprf(j0,j1,j2,j3,j4,j5,j6,j7,0);
  868.    arry[j0][j1][j2][j3][j4][j5][j6][j7][0]='N';
  869.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=0; m=1;}
  870.   else {if (arry[j0][j1][j2][j3][j4][j5][j6][j7][1]=='Y')
  871.    {dprf(j0,j1,j2,j3,j4,j5,j6,j7,1);
  872.    arry[j0][j1][j2][j3][j4][j5][j6][j7][1]='N';
  873.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=1; m=1;}
  874.   else {l=1; if (m==1) kwait(0);};};
  875.   } while (l==0);
  876. };};};};};};};};};
  877. }
  878.  
  879. /* print one of the individual links in a chain */
  880. dprf(i0,i1,i2,i3,i4,i5,i6,i7,i8)
  881. int i0, i1, i2, i3, i4, i5, i6, i7, i8; {
  882. int i, j;
  883. kwait(1);
  884. printf("%1d",i0);
  885. printf("%1d",i1);
  886. printf("%1d",i2);
  887. printf("%1d",i3);
  888. printf("%1d",i4);
  889. printf("%1d",i5);
  890. printf("%1d",i6);
  891. printf("%1d",i7);
  892. printf("-");
  893. printf("%1d",i8);
  894. printf(" ");
  895. i=((((((i0*KK+i1)*KK+i2)*KK+i3)*KK+i4)*KK+i5)*KK+i6)*KK+i7;
  896. j=((((((i1*KK+i2)*KK+i3)*KK+i4)*KK+i5)*KK+i6)*KK+i7)*KK+i8;
  897. lijnk(dd,i,j,3);
  898. }
  899.  
  900. /* end */
  901.